// DecisionTreeVisualizer.java
package org.zjx.core.monitor;

import org.zjx.core.DecisionNode;
import org.zjx.core.nodes.*;

/**
 * 决策树可视化接口 - 提供决策树的文本可视化功能
 *
 * 主要功能：
 * 1. 可视化整个决策树结构
 * 2. 递归可视化子树结构
 *
 * 设计特点：
 * - 使用接口定义可视化契约
 * - 提供默认实现(visualizeSubTree)方便扩展
 * - 支持不同类型的决策节点(SequenceNode, ConditionNode, ActionNode)
 */
public interface DecisionTreeVisualizer {
    /**
     * 可视化整个决策树
     * @param root 决策树的根节点
     * @return 表示决策树结构的字符串
     */
    String visualize(DecisionNode root);

    /**
     * 递归可视化子树
     * @param node 当前子树根节点
     * @param depth 当前递归深度(用于缩进)
     * @return 表示子树结构的字符串
     *
     * 默认实现处理三种节点类型：
     * 1. SequenceNode: 顺序节点，依次处理所有子节点
     * 2. ConditionNode: 条件节点，分别处理true分支和false分支
     * 3. ActionNode: 动作节点，处理下一个节点(如果有)
     */
    default String visualizeSubTree(DecisionNode node, int depth) {
        StringBuilder sb = new StringBuilder();
        // 添加当前节点ID，带缩进(缩进量=深度)
        sb.append("  ".repeat(Math.max(0, depth)));
        sb.append(node.getNodeId()).append("\n");

        // 根据节点类型递归处理子节点
        if (node instanceof SequenceNode) {
            // 顺序节点: 依次处理所有子节点
            ((SequenceNode) node).getNodes().forEach(n -> sb.append(visualizeSubTree(n, depth + 1)));
        } else if (node instanceof ConditionNode cn) {
            // 条件节点: 分别处理true分支和false分支
            sb.append(visualizeSubTree(cn.getTrueBranch(), depth + 1));
            sb.append(visualizeSubTree(cn.getFalseBranch(), depth + 1));
        } else if (node instanceof ActionNode an) {
            // 动作节点: 处理下一个节点(如果有)
            if (an.getNext() != null) {
                sb.append(visualizeSubTree(an.getNext(), depth + 1));
            }
        }
        return sb.toString();
    }
}